Métodos Predictivos (Clasificación o Aprendizaje-Supervisado)

PROMiDAT Iberoamericano

Paquetes necesarios

library(caret)
Loading required package: lattice
Loading required package: ggplot2
library(traineR)

Attaching package: 'traineR'
The following object is masked from 'package:caret':

    contr.dummy

Índices de Calidad del Modelo

El método Redes Neuronales

Ejemplo Iris

Distribución de las clases

setwd("~/Google Drive/MDCurso/Datos")
datos        <- read.csv("iris.csv", sep = ";", dec='.', header = T , stringsAsFactors = TRUE)
# Equilibrio de la variable a predecir
prediction.variable.balance(datos,"tipo")

Usando el paquete traineR

# Vamos a generar al azar una tabla de testing de con el 30% de los datos y una tabla de aprendizaje del 70% 
tam <- dim(datos)
n   <- tam[1]
muestra      <- sample(1:n, floor(n*0.30))
ttesting     <- datos[muestra,]
taprendizaje <- datos[-muestra,]

modelo       <- train.nnet(formula = tipo~.,data = taprendizaje, size = 4)
# weights:  35
initial  value 143.818914 
iter  10 value 55.099069
iter  20 value 47.131962
iter  30 value 19.516679
iter  40 value 5.756881
iter  50 value 4.753205
iter  60 value 4.541411
iter  70 value 4.540975
iter  80 value 4.540924
final  value 4.540924 
converged
prediccion   <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
[1] versicolor virginica  setosa     setosa     setosa     virginica 
Levels: setosa versicolor virginica
MC <- confusion.matrix(ttesting, prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)

Confusion Matrix:
            prediction
real         setosa versicolor virginica
  setosa         13          0         0
  versicolor      0         15         1
  virginica       0          0        16

Overall Accuracy: 0.9778
Overall Error:    0.0222

Category Accuracy:

       setosa   versicolor    virginica
     1.000000     0.937500     1.000000
# Igualmente se pueden usar todos los parámetros
modelo <- train.nnet(tipo~p.largo+p.ancho,
                     data    = taprendizaje,
                     size    = 4,
                     rang    = 0.1,
                     decay   = 5e-4,
                     maxit   = 200,
                     MaxNWts = 500,
                     trace   = FALSE)

prediccion <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
[1] versicolor virginica  setosa     setosa     setosa     virginica 
Levels: setosa versicolor virginica
MC <- confusion.matrix(ttesting,prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)

Confusion Matrix:
            prediction
real         setosa versicolor virginica
  setosa         13          0         0
  versicolor      0         16         0
  virginica       0          0        16

Overall Accuracy: 1.0000
Overall Error:    0.0000

Category Accuracy:

       setosa   versicolor    virginica
     1.000000     1.000000     1.000000

Ejemplo Scoring

Distribución de las clases

setwd("~/Google Drive/MDCurso/Datos")
datos <- read.csv("MuestraCredito5000V2.csv", sep = ";", header = T, stringsAsFactors = TRUE)
# Equilibrio de la variable a predecir
prediction.variable.balance(datos,"BuenPagador")

Con el paquete traineR

# Recodifica las variables como categóricas ordinales
datos$IngresoNeto       <- factor(datos$IngresoNeto,ordered = TRUE)
datos$CoefCreditoAvaluo <- factor(datos$CoefCreditoAvaluo,ordered = TRUE)
str(datos)
'data.frame':   5000 obs. of  6 variables:
 $ MontoCredito     : int  14327 111404 21128 15426 10351 27060 243369 16300 18319 107037 ...
 $ IngresoNeto      : Ord.factor w/ 2 levels "1"<"2": 1 1 1 2 1 1 1 2 2 2 ...
 $ CoefCreditoAvaluo: Ord.factor w/ 12 levels "1"<"2"<"3"<"4"<..: 1 1 1 1 1 1 1 1 1 1 ...
 $ MontoCuota       : Factor w/ 4 levels "Alto","Bajo",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ GradoAcademico   : Factor w/ 2 levels "Bachiller","Licenciatura": 1 1 1 1 1 1 1 1 1 1 ...
 $ BuenPagador      : Factor w/ 2 levels "No","Si": 2 2 2 2 2 2 2 2 2 2 ...
# Usamos createDataPartition del paquete caret para generar las particiones training-testing
# y: vector de datos, se le pasa la variable a predecir para que trate de equilibrar las distribuciones en las muestras respecto a los niveles de esta variable
# p: es el porcentaje para training
# list: F para que devuelva un array en lugar de una lista
# Vamos a generar una tabla de testing con el 15% de los datos y una tabla de aprendizaje del 85%.
muestra      <- createDataPartition(y = datos$BuenPagador, p = 0.85, list = F)
taprendizaje <- datos[muestra, ]
ttesting     <- datos[-muestra, ]

modelo <- train.nnet(formula = BuenPagador~.,
                     data    = taprendizaje,
                     size    = 200,
                     MaxNWts = 5000,
                     rang    = 0.1,
                     decay   = 5e-4,
                     maxit   = 200,
                     trace   = FALSE)

prediccion <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
[1] Si Si Si Si Si Si
Levels: No Si
MC <- confusion.matrix(ttesting, prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)

Confusion Matrix:
    prediction
real  No  Si
  No   0 105
  Si   0 644

Overall Accuracy: 0.8598
Overall Error:    0.1402

Category Accuracy:

           No           Si
     0.000000     1.000000

Selección de Variables

# Poder predictivo variables númericas y categóricas
numerical.predictive.power(datos, "BuenPagador","MontoCredito")

categorical.predictive.power(datos,"BuenPagador", "CoefCreditoAvaluo")

categorical.predictive.power(datos,"BuenPagador", "MontoCuota")

categorical.predictive.power(datos,"BuenPagador", "GradoAcademico")

categorical.predictive.power(datos,"BuenPagador", "IngresoNeto")

Predicción con selección de variables

modelo <- train.nnet(formula = BuenPagador~CoefCreditoAvaluo + MontoCuota + IngresoNeto,
                     data    = taprendizaje,
                     size    = 200,
                     MaxNWts = 5000,
                     rang    = 0.1,
                     decay   = 5e-4,
                     maxit   = 200,
                     trace   = FALSE)

prediccion <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
[1] Si Si Si Si Si Si
Levels: No Si
MC <- confusion.matrix(ttesting, prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)

Confusion Matrix:
    prediction
real  No  Si
  No  16  89
  Si  11 633

Overall Accuracy: 0.8665
Overall Error:    0.1335

Category Accuracy:

           No           Si
     0.152381     0.982919

Con el paquete neuralnet mediante el paquete traineR

Se estandariza la forma de usarlo

modelo <- train.neuralnet(formula       = BuenPagador~. ,
                          data          = taprendizaje, 
                          hidden        = c(6, 4, 3), 
                          linear.output = FALSE, 
                          threshold     = 0.1, 
                          stepmax       = 1e+06)

prediccion <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
## [1] Si Si Si Si Si Si
## Levels: No Si
MC <- confusion.matrix(ttesting, prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)
## 
## Confusion Matrix:
##     prediction
## real  No  Si
##   No   0 105
##   Si   0 644
## 
## Overall Accuracy: 0.8598
## Overall Error:    0.1402
## 
## Category Accuracy:
## 
##            No           Si
##      0.000000     1.000000
# Plot de la red. rep = "best" grafica la mejor repetición según el parámetro rep en neuralnet
plot(modelo, rep = "best")

Con selección de variables

modelo     <- train.neuralnet(formula       = BuenPagador~CoefCreditoAvaluo + MontoCuota ,
                              data          = taprendizaje, 
                              hidden        = c(6, 4, 3), 
                              linear.output = FALSE, 
                              threshold     = 0.1, 
                              stepmax       = 1e+06)

prediccion <- predict(modelo, ttesting, type = "class")
head(prediccion$prediction)
## [1] Si Si Si Si Si Si
## Levels: No Si
MC <- confusion.matrix(ttesting, prediccion)
# Índices de Calidad de la predicción
general.indexes(mc = MC)
## 
## Confusion Matrix:
##     prediction
## real  No  Si
##   No  11  94
##   Si   7 637
## 
## Overall Accuracy: 0.8652
## Overall Error:    0.1348
## 
## Category Accuracy:
## 
##            No           Si
##      0.104762     0.989130
# Plot de la red. rep = "best" grafica la mejor repetición según el parámetro rep en neuralnet
plot(modelo, rep = "best")